package br.uvv.sao.rn;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.uvv.sao.dao.RealizarProvaDAO;
import br.uvv.sao.domain.Alternativa;
import br.uvv.sao.domain.Aluno;
import br.uvv.sao.domain.AlunoOferta;
import br.uvv.sao.domain.Prova;
import br.uvv.sao.domain.ProvaRealizada;
import br.uvv.sao.domain.Questao;
import br.uvv.sao.domain.QuestaoMarcadaProvaRealizada;
import br.uvv.sao.util.DAOException;
import br.uvv.sao.util.RNException;

public class RealizarProvaRN implements Serializable {
	private static final long serialVersionUID = -7774072271805844220L;

	public List<Prova> getListaProvas(Aluno alunoInstance, Date buscaAno,
			String buscaSemestre, Long buscaDisciplina, Long buscaProfessor) throws DAOException {
		RealizarProvaDAO ofertaDAO = new RealizarProvaDAO();
		List<Prova> modelList = ofertaDAO.getListProvas(alunoInstance, buscaAno, buscaSemestre, buscaDisciplina, buscaProfessor);
		return modelList;
	}

	public List<Questao> getListaQuestao(Prova provaInstance) throws DAOException {
		RealizarProvaDAO ofertaDAO = new RealizarProvaDAO();
		List<Questao> modelList = ofertaDAO.getListQuestoes(provaInstance);
		return modelList;
	}

	public void marcarAlternativa(Long alternativaMarcada, Prova provaInstance,
			Aluno alunoInstance) throws RNException{
		Alternativa alternativa = new Alternativa();
		AlunoOferta oferta = new AlunoOferta();
		ProvaRealizada provaRealizada = new ProvaRealizada();
		QuestaoMarcadaProvaRealizada questaMarcada = new QuestaoMarcadaProvaRealizada();
		try {
			RealizarProvaDAO ofertaDAO = new RealizarProvaDAO();
			alternativa = ofertaDAO.getAlternativa(alternativaMarcada);
			oferta = ofertaDAO.getAlunoOferta(provaInstance.getAplicadaEm(), alunoInstance);
			if(alternativaValida(alternativa)){
				if(ofertaValida(oferta)){
					provaRealizada = ofertaDAO.getProvaRealizada(provaInstance, oferta, alternativa.getQuestao());
				}else{
					System.out.println("Erro ao recuperar oferta");
				}
			}else{
				System.out.println("Erro ao recuperar alternativa");
			}	
			if(alternativaValida(alternativa)){
				if(provaRealizadaValida(provaRealizada)){
					questaMarcada = ofertaDAO.getQuestaoMarcada(provaRealizada, alternativa.getQuestao());
				}else{
					System.out.println("Erro ao recuperar provaRealizada");
				}
			}else{
				System.out.println("Erro ao recuperar alternativa");
			}
			if(questaMarcadaValida(questaMarcada)){
				provaRealizada.setAlunoOferta(oferta);
				provaRealizada.setDataHoraUltimaAlteracao(new Date());
				provaRealizada.setProvaReferencia(provaInstance);
				provaRealizada.setQuestaoReferencia(alternativa.getQuestao());
				ofertaDAO.salvar(provaRealizada);
				questaMarcada.setAlterativaEscolhida(alternativa);
				questaMarcada.setDataHoraMarcada(new Date());
				questaMarcada.setProvaReferencia(provaRealizada);
				questaMarcada.setQuestaoReferencia(alternativa.getQuestao());
				ofertaDAO.salvar(questaMarcada);
				alternativa.getQuestao().setAlternativaEscolhida(alternativa);
				ofertaDAO.atualizar(alternativa.getQuestao());
			}else{
				provaRealizada = new ProvaRealizada();
				provaRealizada.setAlunoOferta(oferta);
				provaRealizada.setDataHoraUltimaAlteracao(new Date());
				provaRealizada.setProvaReferencia(provaInstance);
				provaRealizada.setQuestaoReferencia(alternativa.getQuestao());
				provaRealizada.setVersion(0);
				ofertaDAO.salvar(provaRealizada);
				questaMarcada = new QuestaoMarcadaProvaRealizada();
				questaMarcada.setAlterativaEscolhida(alternativa);
				questaMarcada.setDataHoraMarcada(new Date());
				questaMarcada.setProvaReferencia(provaRealizada);
				questaMarcada.setQuestaoReferencia(alternativa.getQuestao());
				questaMarcada.setVersion(0);
				ofertaDAO.salvar(questaMarcada);
				alternativa.getQuestao().setAlternativaEscolhida(alternativa);
				ofertaDAO.atualizar(alternativa.getQuestao());
			}
		} catch (DAOException e) {
			throw new RNException(e);
		}
	}

	private boolean provaRealizadaValida(ProvaRealizada provaRealizada) {
		try {
			if(provaRealizada.getId() > 0){
				return true;
			}
		} catch (NullPointerException e) {
			return false;
		}
		return false;
	}

	private boolean ofertaValida(AlunoOferta oferta) {
		try {
			if(oferta.getId() > 0){
				return true;
			}
		} catch (NullPointerException e) {
			return false;
		}
		return false;
	}

	private boolean alternativaValida(Alternativa alternativa) {
		try {
			if(alternativa.getId() > 0){
				return true;
			}
		} catch (NullPointerException e) {
			return false;
		}
		return false;
	}

	private boolean questaMarcadaValida(
			QuestaoMarcadaProvaRealizada questaMarcada) {
		try {
			if(questaMarcada.getId() > 0){
				return true;
			}
		} catch (NullPointerException e) {
			return false;
		}
		return false;
	}
	
	public List<ProvaRealizada> listarProvasRealizadas(Prova provaInstance, Aluno aluno) throws RNException{
		RealizarProvaDAO ofertaDAO = new RealizarProvaDAO();
		List<ProvaRealizada> modelList = new ArrayList<ProvaRealizada>();
		AlunoOferta oferta = new AlunoOferta();
		try {
			oferta = ofertaDAO.getAlunoOferta(provaInstance.getAplicadaEm(), aluno);
			modelList = ofertaDAO.listarProvasRealizadas(provaInstance, oferta);
		} catch (DAOException e) {
			throw new RNException(e);
		}
		return modelList;
	}
}
